package geekstudy.week2;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * 811. 子域名访问计数
 * https://leetcode-cn.com/problems/subdomain-visit-count/
 * 执行结果： 通过 显示详情
 *
 * 添加备注 使用拼接子域名方式
 * 执行用时：26 ms, 在所有 Java 提交中击败了39.31% 的用户
 * 内存消耗：39.5 MB, 在所有 Java 提交中击败了55.60% 的用户
 *
 * 使用返回子域名列表方式
 * 执行用时：21 ms, 在所有 Java 提交中击败了75.15% 的用户
 * 内存消耗：39.6 MB, 在所有 Java 提交中击败了39.71% 的用户
 *
 */
public class Week2SubdomainVisitCount {

    /**
     * 实现方法
     * @param cpdomains 域名计数数字
     * @return 子域名计数列表
     */
    public List<String> subdomainVisits(String[] cpdomains) {
        List<String> resultList = new ArrayList<String>();
        if(cpdomains != null && cpdomains.length > 0 ){
            Map<String, Integer> domainCountMap = new HashMap<String, Integer>();
            for(String countDomain : cpdomains) {
                if(countDomain.contains(" ")) {
                    String[] countArray = countDomain.split(" ");
                    Integer count = Integer.valueOf(countArray[0]);
                    String domain = countArray[1];
                    if(domain.contains(".")) {
                        // Java 正则匹配 . 需要转义 使用 \\.
                        // String[] subDomainArray = domain.split("\\.");
                        // for(int size = 0; size < subDomainArray.length; size++) {
                        //    String subdomain = subdomain(subDomainArray, size);
                        //     putVisitCount(domainCountMap, subdomain, count);
                        // }

                        // 换一种方法 截取字符串
                        List<String> subdomainList = subdomainList(domain);
                        for(String subdomain : subdomainList) {
                            putVisitCount(domainCountMap, subdomain, count);
                        }

                    } else {
                        putVisitCount(domainCountMap, domain, count);
                    }
                }
            }

            // 取出结果
            for(String subDomain : domainCountMap.keySet()) {
                Integer count = domainCountMap.get(subDomain);
                resultList.add(count + " " + subDomain);
            }
        }


        return resultList;
    }

    /**
     * 放入子域名个数 不存在直接放入 存在需要累加个数
     * @param domainCountMap 子域名个数Map
     * @param domain 域名
     * @param count 个数
     */
    private void putVisitCount(Map<String, Integer> domainCountMap, String domain, Integer count) {
        if(domainCountMap.containsKey(domain)) {
            domainCountMap.put(domain, domainCountMap.get(domain) + count);
        } else {
            domainCountMap.put(domain, count);
        }
    }

    /**
     * 返回子域名列表
     * @param domain 域名
     * @return 子域名列表
     */
    private List<String> subdomainList(String domain) {
        List<String> subdomainList = new ArrayList<String>();
        subdomainList.add(domain);

        char[] domainCharArray = domain.toCharArray();
        for(int position = 0; position < domainCharArray.length; position++) {
            if('.' == domainCharArray[position]) {
                // 从 position + 1 位置开始, 字符串长度是 length - position
                int startIndex = position + 1;
                subdomainList.add(new String(domainCharArray, startIndex, domainCharArray.length - startIndex));
            }
        }

        return subdomainList;
    }

    /**
     * 获取子域名
     * @param domainArray 分割后域名数组
     * @param fromIndex 分割后域名数组 开始位置
     * @return 完整子域名
     */
    private String subdomain(String[] domainArray, int fromIndex) {
        String subdomain = "";
        for(int index = fromIndex; index < domainArray.length - 1; index++) {
            subdomain += domainArray[index] + ".";
        }
        subdomain += domainArray[domainArray.length - 1];
        return subdomain;
    }


}
